home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume25 / ted / part02 < prev    next >
Encoding:
Text File  |  1991-11-06  |  54.3 KB  |  1,551 lines

  1. Newsgroups: comp.sources.misc
  2. From: dan%step.uucp@uunet.uu.net (Daniel Weaver)
  3. Subject:  v25i027:  ted - Terminfo/termcap test program, Part02/07
  4. Message-ID: <1991Nov6.041550.4839@sparky.imd.sterling.com>
  5. X-Md4-Signature: dc1c4a30e7cf5b0a2e9e362610d95c16
  6. Date: Wed, 6 Nov 1991 04:15:50 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: dan%step.uucp@uunet.uu.net (Daniel Weaver)
  10. Posting-number: Volume 25, Issue 27
  11. Archive-name: ted/part02
  12. Environment: UNIX
  13.  
  14. #! /bin/sh
  15. # This is a shell archive.  Remove anything before this line, then feed it
  16. # into a shell via "sh file" or similar.  To overwrite existing files,
  17. # type "sh file -c".
  18. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  19. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  20. # If this archive is complete, you will see the following message at the end:
  21. #        "End of archive 2 (of 7)."
  22. # Contents:  pad.c sysdep.c
  23. # Wrapped by dan@step on Fri Nov  1 11:28:24 1991
  24. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  25. if test -f 'pad.c' -a "${1}" != "-c" ; then 
  26.   echo shar: Will not clobber existing file \"'pad.c'\"
  27. else
  28. echo shar: Extracting \"'pad.c'\" \(40122 characters\)
  29. sed "s/^X//" >'pad.c' <<'END_OF_FILE'
  30. X/*
  31. X** This software is Copyright (c) 1991 by Daniel Weaver.
  32. X**
  33. X** Permission is hereby granted to copy, distribute or otherwise
  34. X** use any part of this package as long as you do not try to make
  35. X** money from it or pretend that you wrote it.  This copyright
  36. X** notice must be maintained in any copy made.
  37. X**
  38. X** Use of this software constitutes acceptance for use in an AS IS
  39. X** condition. There are NO warranties with regard to this software.
  40. X** In no event shall the author be liable for any damages whatsoever
  41. X** arising out of or in connection with the use or performance of this
  42. X** software.  Any use of this software is at the user's own risk.
  43. X**
  44. X**  If you make modifications to this software that you feel
  45. X**  increases it usefulness for the rest of the community, please
  46. X**  email the changes, enhancements, bug fixes as well as any and
  47. X**  all ideas to me. This software is going to be maintained and
  48. X**  enhanced as deemed necessary by the community.
  49. X*/
  50. X/* test the pad counts on the terminal */
  51. X
  52. X#include "curses.h"
  53. X#include "ted.h"
  54. X
  55. X#define SELECT1(a) (!cap_select || strcmp(cap_select, a) == 0)
  56. X
  57. Xstatic char every_line[] = "This text should be on every line.";
  58. Xstatic char all_lines[] = "All lines should be the same.  ";
  59. Xstatic char above_line[] = "The above line should be all X's.  ";
  60. Xchar letters[] = "AbCdefghiJklmNopQrStuVwXyZ";
  61. X
  62. Xstatic char *clr_test_name[CLEAR_TEST_MAX] = {
  63. X   "full page", "sparse page", "short lines", "one full line",
  64. X   "one short line"};
  65. X
  66. Xstatic char **DF_scroll_forward, **DF_newline;
  67. Xstatic char **DF_cursor_left, **DF_tab;
  68. X
  69. X#ifdef ACCO
  70. XFILE *fpacco;
  71. X#endif
  72. X
  73. Xstatic void
  74. Xloop_test(cap, name, long_name)
  75. Xchar **cap, *name, *long_name;
  76. X   {  /* exercise one capability (a common case) */
  77. X      int i;
  78. X
  79. X      if (begin_test(cap, name, long_name, NULL, FALSE))
  80. X         do {
  81. X            go_home();
  82. X               do {
  83. X                  page_loop();
  84. X                     for (i = 1; i < columns; i++) {
  85. X                        char_max -= pad_sent;  ++ops;
  86. X                        putp(*cap);  putchp(letter);
  87. X                        if (char_sent > char_max) break;
  88. X                     }
  89. X               } while (char_sent < char_max);
  90. X            home_down();
  91. X         } while(end_test(NULL, 0));
  92. X   }
  93. X
  94. X
  95. Xstatic void
  96. Xclear_pad(is_clear)
  97. Xint is_clear;
  98. X   {  /* run the clear screen tests (also clear-to-end-of-screen) */
  99. X      char *end_message;
  100. X      int j, k;
  101. X
  102. X         for (j = 0; j < CLEAR_TEST_MAX; j++) clr_test_value[j] = 32767;
  103. X      clear_select = auto_right_margin ? 0 : 1;
  104. X      skip_next = FALSE;
  105. X#ifdef SVR3
  106. X      if (enter_am_mode)
  107. X         {
  108. X             putp(enter_am_mode);
  109. X             clear_select = 0;
  110. X         }
  111. X#endif
  112. X      augment = is_clear ? lines : lines - 1;
  113. X         for ( ; clear_select < CLEAR_TEST_MAX; clear_select++) {
  114. X         do {
  115. X            if (augment > lines || is_clear || !cursor_address)
  116. X               augment = lines;
  117. X            else
  118. X               {
  119. X                  if (augment <= 1) augment = 2;
  120. X                  if (augment < lines)
  121. X                     {
  122. X                        put_clear();
  123. X                        ptext("This line should not be erased (ed)");
  124. X                     }
  125. X               }
  126. X            short_subject(reps = augment);
  127. X               switch (clear_select) {
  128. X                  case 0:
  129. X                     end_message = "All the dots should line up.  ";
  130. X                     if (reps > rated_lines) reps = rated_lines;
  131. X                     break;
  132. X                  case 1:
  133. X                     end_message = "\r\n";
  134. X                     if (cursor_down) break;
  135. X                     clear_select++;
  136. X                  case 2:
  137. X                     end_message = "\r\n";
  138. X                     if (newline) break;
  139. X                     clear_select++;
  140. X                  case 3:
  141. X                  case 4:
  142. X                     end_message = "\r\n";
  143. X                     break;
  144. X               }
  145. X               while(char_sent < char_max) {
  146. X                  if (is_clear) put_clear();
  147. X                  else
  148. X                     {
  149. X                        if (augment == lines) go_home();
  150. X                        else tputs(tcup(cursor_address,
  151. X                           lines - reps, 0),
  152. X                           lines - reps, putch);
  153. X                        tputs(clr_eos, reps, putch);
  154. X                     }
  155. X                  char_max -= pad_sent;  ++ops;
  156. X                  switch (clear_select) {
  157. X                     case 0:  /* full screen test */
  158. X                           for (j = 1; j < reps; j++) {
  159. X                                 for (k = 0; k < columns; k++)
  160. X                                    if (k & 0xF) put_this(letter);
  161. X                                    else put_this('.');
  162. X                           }
  163. X                        break;
  164. X                     case 1:  /* sparse screen test */
  165. X                           for (j = columns - reps; j > 2; j--)
  166. X                              put_this(letter);
  167. X                           for (j = 2; j < reps; j++) {
  168. X                              putp(cursor_down);
  169. X                              put_this(letter);
  170. X                           }
  171. X                        break;
  172. X                     case 2:  /* short lines */
  173. X                           for (j = 2; j < reps; j++) {
  174. X                              put_this(letter);
  175. X                              putp(newline);
  176. X                           }
  177. X                        put_this(letter);
  178. X                        break;
  179. X                     case 3:  /* one full line */
  180. X                           for (j = columns - 5; j > 1; j--)
  181. X                              put_this(letter);
  182. X                        break;
  183. X                     case 4:  /* one short line */
  184. X                        put_str("Erase this!");
  185. X                        break;
  186. X                     }
  187. X                  NEXT_LETTER;
  188. X               }
  189. X         } while(end_test(end_message, 1));
  190. X         if (clear_select < CLEAR_TEST_MAX && time_pad && enq_ack()) ;
  191. X         if (skip_next | stop_testing) break;
  192. X      }
  193. X      k = 0;
  194. X         for (j = 0; j < CLEAR_TEST_MAX; j++) {
  195. X            if (clr_test_value[j] != 32767)
  196. X               {
  197. X                  k++;
  198. X                  sprintf(temp, "(%s) %s", current_test, clr_test_name[j]);
  199. X                  ptext(temp);
  200. X                  put_dec(" %d.%d milliseconds", clr_test_value[j]);
  201. X                  sprintf(temp, " %d reps", clr_test_reps[j]);
  202. X                  ptext(temp);
  203. X                  put_crlf();
  204. X               }
  205. X         }
  206. X      if (k) (void) wait_here();
  207. X}
  208. X
  209. X
  210. Xstatic void
  211. Xsetup_cap(n1, v1, nn, vn)
  212. Xchar *n1, **v1, *nn, **vn;
  213. X   {  /* select single or multiple caps for (ind) (ri) (il) (dl) */
  214. X      if (!*vn || (*v1 && augment == 1))
  215. X         {
  216. X            ced_name[0] = n1;
  217. X            ced_value[0] = v1;
  218. X            reps = 0;
  219. X            augment = 1;
  220. X         }
  221. X      else
  222. X         {
  223. X            if (augment >= lines) augment = lines - 1;
  224. X            ced_name[0] = nn;
  225. X            ced_value[0] = vn;
  226. X            reps = augment;
  227. X         }
  228. X      capper = enter_cap(current_test = ced_name[0], *ced_value[0]);
  229. X      milli_pad = cap_list[capper].cur_plain;
  230. X      milli_reps = cap_list[capper].cur_star;
  231. X      sprintf(done_test, "Done. (%s)", current_test);
  232. X      short_subject(reps);
  233. X   }
  234. X
  235. X
  236. Xstatic void
  237. Xrin_pad()
  238. X   {  /* test reverse scroll */
  239. X      int i;
  240. X
  241. X      if (begin_test(&parm_rindex, "rin", "scroll reverse n lines",
  242. X         NULL, FALSE)) augment = lines - 1;
  243. X      else
  244. X      if (begin_test(&scroll_reverse, "ri", "scroll reverse",
  245. X         "rin", FALSE)) augment = 1;
  246. X      else return;
  247. X
  248. X         do {
  249. X            setup_cap("ri", &scroll_reverse, "rin", &parm_rindex);
  250. X            go_home();
  251. X               for (i = 1; char_sent < char_max; ++i) {
  252. X                  char_max -= pad_sent;  ++ops;
  253. X                  sprintf(temp, "%d\r", i);
  254. X                  put_str(temp);
  255. X                  if (scroll_reverse && augment == 1)
  256. X                     putp(scroll_reverse);
  257. X                  else tputs(tparm(parm_rindex, reps), reps, putch);
  258. X               }
  259. X            put_str("This line should be on the bottom.\r");
  260. X            if (scroll_reverse && augment == 1)
  261. X               for (i = 1; i < lines; i++) {
  262. X                  ++ops;
  263. X                  putp(scroll_reverse);
  264. X               }
  265. X            else tputs(tparm(parm_rindex, lines - 1), lines - 1, putch);
  266. X            sprintf(temp, "\nScroll reverse %d line%s.  ", augment,
  267. X               augment == 1 ? "" : "s");
  268. X         } while(end_test(temp, 1));
  269. X   }
  270. X
  271. X
  272. Xstatic void
  273. Xil_pad()
  274. X   {  /* test insert line */
  275. X      int i;
  276. X
  277. X      if (begin_test(&parm_insert_line, "il", "insert n lines",
  278. X         NULL, TRUE)) augment = lines - 1;
  279. X      else
  280. X      if (begin_test(&insert_line, "il1", "insert line", "il", FALSE))
  281. X         augment = 1;
  282. X      else return;
  283. X
  284. X         do {
  285. X            setup_cap("il1", &insert_line, "il", &parm_insert_line);
  286. X            go_home();
  287. X               for (i = 1; char_sent < char_max; ++i) {
  288. X                  char_max -= pad_sent;  ++ops;
  289. X                  sprintf(temp, "%d\r", i);
  290. X                  put_str(temp);
  291. X                  if (reps)
  292. X                     tputs(tparm(parm_insert_line, reps), reps, putch);
  293. X                  else putp(insert_line);
  294. X               }
  295. X            put_str("This line should be on the bottom.\r");
  296. X            if (reps)
  297. X               tputs(tparm(parm_insert_line, lines - 1), lines - 1, putch);
  298. X            else
  299. X               for (i = 1; i < lines; i++) {
  300. X                  ++ops;
  301. X                  putp(insert_line);
  302. X               }
  303. X            sprintf(temp, "Insert %d line%s.  ", augment,
  304. X               augment == 1 ? "" : "s");
  305. X         } while(end_test(temp, 1));
  306. X   }
  307. X
  308. X
  309. Xstatic void
  310. Xindn_pad()
  311. X   {  /* test scroll forward */
  312. X      int i;
  313. X
  314. X      if (begin_test(&parm_index, "indn", "scroll n lines",
  315. X         NULL, FALSE)) augment = lines - 1;
  316. X      else
  317. X      if (begin_test(DF_scroll_forward, "ind", "scroll forward",
  318. X         "indn", FALSE)) augment = 1;
  319. X      else return;
  320. X
  321. X         do {
  322. X            setup_cap("ind", DF_scroll_forward, "indn", &parm_index);
  323. X            /* go to the bottom of the screen */
  324. X            home_down();
  325. X               for (i = 1; char_sent < char_max; ++i) {
  326. X                  char_max -= pad_sent;  ++ops;
  327. X                  sprintf(temp, "%d\r", i);
  328. X                  put_str(temp);
  329. X                  if (augment > 1)
  330. X                     tputs(tparm(parm_index, reps), reps, putch);
  331. X                  else
  332. X                  put_ind();
  333. X               }
  334. X            put_str("This line should be on the top.\r");
  335. X            if (augment == 1)
  336. X               for (i = 1; i < lines; i++) {
  337. X                  ++ops;
  338. X                  put_ind();
  339. X               }
  340. X            else tputs(tparm(parm_index, lines - 1), lines - 1, putch);
  341. X            go_home();
  342. X            sprintf(temp, "\nScroll forward %d line%s.  ", augment,
  343. X               augment == 1 ? "" : "s");
  344. X         } while(end_test(temp, 1));
  345. X   }
  346. X
  347. X
  348. Xstatic void
  349. Xdl_pad()
  350. X   {  /* test delete lines */
  351. X      int i;
  352. X
  353. X      if (begin_test(&parm_delete_line, "dl", "delete n lines",
  354. X         NULL, TRUE)) augment = lines - 1;
  355. X      else
  356. X      if (begin_test(&delete_line, "dl1", "delete line", "dl", TRUE))
  357. X         augment = 1;
  358. X      else return;
  359. X
  360. X         do {
  361. X            setup_cap("dl1", &delete_line, "dl", &parm_delete_line);
  362. X            go_home();
  363. X               for (i = 0; char_sent < char_max; ++i) {
  364. X                  char_max -= pad_sent;  ++ops;
  365. X                  sprintf(temp, "%d\r", i);
  366. X                  if ((i & 0x7f) == 0 && augment < lines - 1)
  367. X                     {
  368. X                        go_home();
  369. X                        putln(temp);
  370. X                     }
  371. X                  put_str(temp);
  372. X                  if (reps) tputs(delete_line, reps, putch);
  373. X                  else putp(delete_line);
  374. X               }
  375. X            home_down();
  376. X            put_str("This line should be on the top.");
  377. X            go_home();
  378. X            if (reps)
  379. X               tputs(tparm(parm_delete_line, lines - 1), lines - 1, putch);
  380. X            else
  381. X               for (i = 1; i < lines; i++) {
  382. X                  ++ops;
  383. X                  putp(delete_line);
  384. X               }
  385. X            sprintf(temp, "\nDelete %d line%s.  ", augment,
  386. X               augment == 1 ? "" : "s");
  387. X         } while(end_test(temp, 1));
  388. X   }
  389. X
  390. X
  391. Xvoid
  392. Xtest_pad(cap)
  393. Xchar *cap;  /* capability to be tested, NULL if test all */
  394. X   {
  395. X      int i, j, k, l, csr_not_tested, hzcc;
  396. X      int scroll_chars, scroll_ms_delay;
  397. X      char *s;
  398. X
  399. X      if (tty_can_sync == 1) verify_time();
  400. X      control_init();
  401. X      put_clear();
  402. X
  403. X      cap_tested = 0;  cap_select = cap;
  404. X      hzcc = columns * 8 / 10;  /* horizontal character count */
  405. X
  406. X      /* set up default caps for translate mode */
  407. X      DF_tab = translate_mode ? &tab : &TM_tab;
  408. X      DF_newline = (translate_mode && newline) ? &newline : &TM_newline;
  409. X      DF_cursor_left = (translate_mode && cursor_left)
  410. X         ? &cursor_left : &TM_cursor_left;
  411. X#ifdef SVR3
  412. X      DF_scroll_forward = ((translate_mode && scroll_forward)
  413. X         || over_strike) ? &scroll_forward : &TM_scroll_forward;
  414. X#else
  415. X      DF_scroll_forward = (translate_mode && scroll_forward)
  416. X         ? &scroll_forward : &TM_scroll_forward;
  417. X#endif
  418. X
  419. X#ifdef ACCO
  420. X      /* open the results file for multi_test() */
  421. X      fpacco = fopen("ted.acco", "w");
  422. X#endif
  423. X
  424. X      /* findout how much the scroll delay will effect the results */
  425. X      capper = enter_cap("ind", *DF_scroll_forward);
  426. X      milli_pad = scroll_ms_delay = cap_list[capper].cur_plain;
  427. X      short_subject(0);
  428. X      scroll_chars = pad_sent;
  429. X
  430. X      if (reset_1string)
  431. X         loop_test(&reset_1string, "rs1", "reset string 1");
  432. X      if (reset_2string)
  433. X         loop_test(&reset_2string, "rs2", "reset string 2");
  434. X      if (reset_3string)
  435. X         loop_test(&reset_3string, "rs3", "reset string 3");
  436. X
  437. X#ifdef SVR3
  438. X      /* the reset strings may dink with the XON/XOFF modes */
  439. X      if (select_xon_xoff == 0 && exit_xon_mode) putp(exit_xon_mode);
  440. X      if (select_xon_xoff == 1 && enter_xon_mode) putp(enter_xon_mode);
  441. X#endif
  442. X      if (init_1string)
  443. X         loop_test(&init_1string, "is1", "init string 1");
  444. X      if (init_2string)
  445. X         loop_test(&init_2string, "is2", "init string 2");
  446. X      if (init_3string)
  447. X         loop_test(&init_3string, "is3", "init string 3");
  448. X
  449. X#ifdef SVR3
  450. X      can_test("(rmxon)(smxon)");
  451. X      if (select_xon_xoff == 0 && exit_xon_mode)
  452. X         if (SELECT1("rmxon"))
  453. X            loop_test(&exit_xon_mode, "rmxon", "exit xon/xoff mode");
  454. X         else putp(exit_xon_mode);
  455. X      if (select_xon_xoff == 1 && enter_xon_mode) putp(enter_xon_mode);
  456. X#endif
  457. X      can_test("(smcup)(rmcup)");
  458. X      if (enter_ca_mode) putp(enter_ca_mode);
  459. X
  460. X      if (!can_clear_screen && !stop_testing)
  461. X         {
  462. X            ptextln("(clear) clear screen not present");
  463. X            ptext("pad processing terminated...");
  464. X            (void) wait_here();
  465. X            return;
  466. X         }
  467. X
  468. X      if (can_go_home && auto_right_margin &&
  469. X         multi_test(NULL, FALSE, 1, 0, 0, 1, "home", &cursor_home))
  470. X         {
  471. X            /* truly brain damaged terminals will fail this test
  472. X               because they cannot accept data at full rate */
  473. X            capper = -2;
  474. X               do {
  475. X                     while(char_sent < char_max) {
  476. X                        go_home();
  477. X                           for (j = 1; j < rated_lines; j++) {
  478. X                                 for (k = 0; k < columns; k++)
  479. X                                    if (k & 0xF) put_this(letter);
  480. X                                    else put_this('.');
  481. X                           }
  482. X                        ops += (lines - 1) + columns;
  483. X                        NEXT_LETTER;
  484. X                     }
  485. X               } while(end_test("All the dots should line up.  ", 1));
  486. X         }
  487. X      if (can_go_home &&
  488. X         multi_test(NULL, FALSE, 1, 0, 4, 2,
  489. X            "home", &cursor_home, "nel", DF_newline))
  490. X         do {
  491. X               while(char_sent < char_max) {
  492. X                  go_home();
  493. X                     for (j = 1; j < rated_lines; j++) {
  494. X                        char_max -= pad_sent;  ++ops;
  495. X                           for (k = 2; k < columns; k++)
  496. X                              if (k & 0xF) putchp(letter);
  497. X                              else putchp('.');
  498. X                        put_crlf();
  499. X                     }
  500. X                  NEXT_LETTER;
  501. X               }
  502. X         } while(end_test("All the dots should line up.  ", 1));
  503. X      if (begin_test(&clear_screen, "clear", "clear screen",
  504. X         NULL, FALSE)) clear_pad(TRUE);
  505. X      if (begin_test(&clr_eos, "ed", "clear to end of screen",
  506. X         NULL, FALSE)) clear_pad(FALSE);
  507. X      augment = hzcc;
  508. X      if (begin_test(&erase_chars, "ech", "erase characters",
  509. X         NULL, FALSE))
  510. X         do {
  511. X            go_home();
  512. X            if (augment > columns - 2) augment = columns - 2;
  513. X            short_subject(reps = augment);
  514. X               for (i = 2; i < lines; i++) {
  515. X                  char_max -= pad_sent;  ++ops;
  516. X                     for (j = 0; j <= reps; j++) putchp(letter);
  517. X                  put_cr();
  518. X                  tputs(tparm(erase_chars, reps), reps, putch);
  519. X                  put_crlf();
  520. X                  if (test_count == 0 && char_sent > char_max) break;
  521. X               }
  522. X               for (i = 1; i <= reps; i++) putchp(' ');
  523. X            putchp(letter);  put_crlf();
  524. X            NEXT_LETTER;
  525. X         } while(end_test(all_lines, 0));
  526. X#ifdef SVR3
  527. X      augment = hzcc;
  528. X      if (begin_test(&clr_bol, "el1", "clear to beginning of line",
  529. X         NULL, TRUE) &&
  530. X         acco_pad("cub1", *DF_cursor_left) &&
  531. X         acco_pad("cub1", *DF_cursor_left) &&
  532. X         acco_pad("nel", *DF_newline))
  533. X         do {
  534. X            go_home();
  535. X            if (augment > columns - 2) augment = columns - 2;
  536. X            short_subject(reps = augment);
  537. X               for (i = 2; i < lines; i++) {
  538. X                  char_max -= pad_sent;  ++ops;
  539. X                     for (j = 0; j <= reps; j++) putchp(letter);
  540. X                  putp(*DF_cursor_left);
  541. X                  putp(*DF_cursor_left);
  542. X                  tputs(clr_bol, reps, putch);
  543. X                  put_crlf();
  544. X                  if (test_count == 0 && char_sent > char_max) break;
  545. X               }
  546. X               for (i = 1; i <= reps; i++) putchp(' ');
  547. X            putchp(letter);  put_crlf();
  548. X            NEXT_LETTER;
  549. X         } while(end_test(all_lines, 0));
  550. X#endif
  551. X      augment = hzcc / 10;
  552. X      if (begin_test(&clr_eol, "el", "clear to end of line",
  553. X         NULL, FALSE) && acco_pad("nel", *DF_newline))
  554. X         do {
  555. X            go_home();
  556. X            if (augment > hzcc) augment = hzcc;
  557. X               for (i = 2; i < lines; i++) {
  558. X                  char_max -= pad_sent;  ++ops;
  559. X                     for (j = -1; j < augment; j++) putchp(letter);
  560. X                  put_cr();
  561. X                  putchp(letter);
  562. X                  putp(clr_eol);
  563. X                  put_crlf();
  564. X                  if (test_count == 0 && char_sent > char_max) break;
  565. X               }
  566. X            putchp(letter);  put_crlf();
  567. X            NEXT_LETTER;
  568. X         } while(end_test(all_lines, 0));
  569. X      if (multi_test("(smdc) or (rmdc) delete mode", FALSE, 0, 7, 6, 2,
  570. X         "smdc", &enter_delete_mode,
  571. X         "rmdc", &exit_delete_mode))
  572. X         do {
  573. X            page_loop();
  574. X               for (i = 1; i < columns; i++) {
  575. X                  char_max -= pad_sent;  ++ops;
  576. X                  putp(enter_delete_mode);
  577. X                  putp(exit_delete_mode);
  578. X                  putchp(letter);
  579. X               }
  580. X            if (char_sent > char_max) home_down();
  581. X         } while(end_test(NULL, 0));
  582. X      augment = hzcc;
  583. X      if (multi_test("(dch) delete characters", TRUE, 4, 0, 14, 3,
  584. X         "smdc", &enter_delete_mode, "dch", &parm_dch,
  585. X         "rmdc", &exit_delete_mode) &&
  586. X         acco_pad(NULL, *DF_newline))
  587. X         {
  588. X               do {
  589. X                  if (augment > hzcc) augment = hzcc;
  590. X                  short_subject(reps = augment);
  591. X                  go_home();
  592. X                     for (i = 2; i < lines; i++) {
  593. X                        char_max -= pad_sent;  ++ops;
  594. X                           for (j = 0; j <= reps; j++) putchp(letter);
  595. X                        put_cr();
  596. X                        putp(enter_delete_mode);
  597. X                        tputs(tparm(parm_dch, reps), reps, putch);
  598. X                        putp(exit_delete_mode);
  599. X                        put_crlf();
  600. X                        if (test_count == 0 && char_sent > char_max) break;
  601. X                     }
  602. X                  putchp(letter);
  603. X                  put_crlf();
  604. X                  NEXT_LETTER;
  605. X               } while(end_test(all_lines, 1));
  606. X            putp(exit_delete_mode);
  607. X         }
  608. X      else  /* no need to test both */
  609. X      if (multi_test("(dch1) delete one character", TRUE, 0x1e, 0, 2, 4,
  610. X         "dch1", &delete_character, "dch", &parm_dch,
  611. X         "smdc", &enter_delete_mode, "rmdc", &exit_delete_mode))
  612. X         do {
  613. X            if (augment > hzcc) augment = hzcc;
  614. X            if (augment < 1) augment = 1;
  615. X            go_home();
  616. X               for (i = 2; i < lines; i++) {
  617. X                     for (j = -1; j < augment; j++) putchp(letter);
  618. X                  put_cr();
  619. X                  putp(enter_delete_mode);
  620. X                     for (j = 0; j < augment; j++) {
  621. X                        char_max -= pad_sent;  ++ops;
  622. X                        putp(delete_character);
  623. X                     }
  624. X                  putp(exit_delete_mode);
  625. X                  put_crlf();
  626. X                  if (test_count == 0 && char_sent > char_max) break;
  627. X               }
  628. X            putchp(letter);  put_crlf();
  629. X            NEXT_LETTER;
  630. X         } while(end_test(all_lines, 0));
  631. X      if (multi_test("(smir) or (rmir) insert mode", FALSE, 0, 7, 6, 2,
  632. X         "smir", &enter_insert_mode,
  633. X         "rmir", &exit_insert_mode))
  634. X         do {
  635. X            page_loop();
  636. X               for (i = 1; i < columns; i++) {
  637. X                  char_max -= pad_sent;  ++ops;
  638. X                  putp(enter_insert_mode);
  639. X                  putp(exit_insert_mode);
  640. X                  putchp(letter);
  641. X               }
  642. X            if (char_sent > char_max) home_down();
  643. X         } while(end_test(NULL, 0));
  644. X      augment = j = columns * 9 / 10;
  645. X      if (multi_test("(ich) insert n characters", TRUE, 4, 0, 14, 3,
  646. X         "smir", &enter_insert_mode,
  647. X         "ich", &parm_ich,
  648. X         "rmir", &exit_insert_mode) &&
  649. X         acco_pad(NULL, *DF_newline) &&
  650. X         acco_pad(NULL, *DF_newline))
  651. X         {
  652. X               do {
  653. X                  if (augment > j) augment = j;
  654. X                  short_subject(reps = augment);
  655. X                  go_home();
  656. X                     for (i = 2; i < lines; i++) {
  657. X                        char_max -= pad_sent;  ++ops;
  658. X                        putchp(letter);
  659. X                        put_cr();
  660. X                        putp(enter_insert_mode);
  661. X                        replace_mode = 0;
  662. X                        tputs(tparm(parm_ich, reps), reps, putch);
  663. X                        putp(exit_insert_mode);  replace_mode = 1;
  664. X                        put_crlf();
  665. X                        if (test_count == 0 && char_sent > char_max) break;
  666. X                     }
  667. X                     for (i = 0; i < reps; i++) putchp(' ');
  668. X                  putchp(letter);  NEXT_LETTER;
  669. X                  put_crlf();
  670. X               } while(end_test(all_lines, 1));
  671. X            putp(exit_insert_mode);
  672. X         }
  673. X      if (multi_test("(smir) (ich1) (rmir) insert character mode",
  674. X         FALSE, 0xC, 0x13, 0xC, 4,
  675. X         "smir", &enter_insert_mode,
  676. X         "ich1", &insert_character, "ip", &insert_padding,
  677. X         "rmir", &exit_insert_mode))
  678. X         {
  679. X            if (!insert_padding && !insert_character)
  680. X               {
  681. X                  (void) acco_pad(NULL, enter_insert_mode);
  682. X                  (void) acco_pad(NULL, exit_insert_mode);
  683. X               }
  684. X            l = columns * 9 / 10;
  685. X               do {
  686. X                  put_clear();
  687. X                     for (i = 2; i < lines; i++) {
  688. X                        putchp(letter);
  689. X                        put_cr();
  690. X                        putp(enter_insert_mode);  replace_mode = 0;
  691. X                        if (!insert_padding && !insert_character)
  692. X                           {  /* only enter/exit is needed */
  693. X                              char_max -= pad_sent;  ++ops;
  694. X                                 for (j = 0; j < l; j++) putchp('.');
  695. X                           }
  696. X                        else
  697. X                           for (j = 0; j < l; j++) {
  698. X                              char_max -= pad_sent;  ++ops;
  699. X                              putp(insert_character);
  700. X                              putchp('.');  putp(insert_padding);
  701. X                           }
  702. X                        putp(exit_insert_mode);  replace_mode = 1;
  703. X                        put_crlf();
  704. X                        if (test_count == 0 && char_sent > char_max) break;
  705. X                     }
  706. X                     for (j = 0; j < l; j++) putchp('.');
  707. X                  putchp(letter);  NEXT_LETTER;
  708. X                  put_crlf();
  709. X               } while(end_test(all_lines, 0));
  710. X            putp(exit_insert_mode);
  711. X         }
  712. X      if (!enter_insert_mode && !exit_insert_mode &&
  713. X          !enter_delete_mode && !exit_delete_mode &&
  714. X         multi_test("(ich1) or (dch1) insert/delete character",
  715. X         FALSE, 0, 7, 6, 2,
  716. X         "ich1", &insert_character, "dch1", &delete_character))
  717. X         do {
  718. X            ptext("\rThis line should not be garbled. It should be left justified.");
  719. X            put_cr();  char_sent = 0;
  720. X               while(char_sent < char_max) {
  721. X                  char_max -= pad_sent;  ++ops;
  722. X                  putp(insert_character);
  723. X                  putp(delete_character);
  724. X               }
  725. X         } while(end_test("\n", 0));
  726. X      augment = columns * 9 / 10;
  727. X      if (begin_test(&repeat_char, "rep", "repeat character",
  728. X         NULL, TRUE))
  729. X         do {
  730. X            if (augment > columns - 2) augment = columns - 2;
  731. X            if (augment < 2) augment = 2;
  732. X            short_subject(reps = augment);
  733. X               do {
  734. X                  go_home();
  735. X                     for (i = 2; i < lines; i++) {
  736. X                        char_max -= pad_sent;  ++ops;
  737. X                        tputs(tparm(repeat_char, letter, reps), reps, putch);
  738. X                        char_count = reps;
  739. X                        put_crlf();
  740. X                     }
  741. X                     for (j = 0; j < reps; j++) putchp(letter);
  742. X                  put_crlf();  NEXT_LETTER;
  743. X               } while(char_sent < char_max);
  744. X         } while(end_test(all_lines, 0));
  745. X      if (begin_test(&cursor_address, "cup", "cursor address",
  746. X         NULL, FALSE))
  747. X         do {  /* the delay repeat factor is probably wrong */
  748. X            l = (columns - 4) >> 1;
  749. X               for (i = 1; i + i + 2 < lines; i++) {
  750. X                     for (j = 0; j <= l; j++) {
  751. X                        char_max -= pad_sent;  ops += 4;
  752. X                        s = tcup(cursor_address, i, j);
  753. X                        tputs(s, lines, putch);  putchp(letter);
  754. X                        s = tcup(cursor_address, i, l + l + 1 - j);
  755. X                        tputs(s, l + l, putch);  putchp(letter);
  756. X                        s = tcup(cursor_address, lines - i, j);
  757. X                        tputs(s, lines, putch);  putchp(letter);
  758. X                        s = tcup(cursor_address, lines - i, l + l + 1 - j);
  759. X                        tputs(s, l + l, putch);  putchp(letter);
  760. X                     }
  761. X                  if (char_sent > char_max) break;
  762. X               }
  763. X            NEXT_LETTER;
  764. X            s = tcup(cursor_address, lines / 2, char_count = l - 6);
  765. X            tputs(s, columns / 2, putch);
  766. X         } while(end_test(NULL, 1));
  767. X      if (begin_test(&down_half_line, "hd", "down half line",
  768. X         NULL, TRUE))
  769. X         do {
  770. X               for (i = 1; i < columns; i += 2) {
  771. X                     for (j = 1; j < i; ++j) putchp(' ');
  772. X                  putp(down_half_line);
  773. X                     for (k = lines + lines; k > 4; k--) {
  774. X                        if (j++ >= columns) break;
  775. X                        char_max -= pad_sent;  ++ops;
  776. X                        putp(down_half_line);
  777. X                        putchp(letter);
  778. X                     }
  779. X                  go_home();
  780. X                  if (char_sent > char_max) break;
  781. X               }
  782. X            NEXT_LETTER;
  783. X         } while(end_test(NULL, 1));
  784. X      if (begin_test(&up_half_line, "hu", "up half line",
  785. X         NULL, TRUE))
  786. X         do {
  787. X               for (i = 1; i < columns; i += 2) {
  788. X                  home_down();
  789. X                     for (j = 1; j < i; ++j) putchp(' ');
  790. X                  putp(up_half_line);
  791. X                     for (k = lines + lines; k > 4; k--) {
  792. X                        if (j++ >= columns) break;
  793. X                        char_max -= pad_sent;  ++ops;
  794. X                        putp(up_half_line);
  795. X                        putchp(letter);
  796. X                     }
  797. X                  if (char_sent > char_max) break;
  798. X               }
  799. X            go_home();
  800. X            NEXT_LETTER;
  801. X         } while(end_test(NULL, 1));
  802. X      rin_pad();
  803. X      indn_pad();
  804. X      if (multi_test("(sc) or (rc) save/restore cursor",
  805. X         FALSE, 0, 7, 6, 2,
  806. X         "sc", &save_cursor, "rc", &restore_cursor))
  807. X         do {
  808. X            page_loop();
  809. X               for (i = 1; i < columns; i++) {
  810. X                  char_max -= pad_sent;  ++ops;
  811. X                  putp(save_cursor);  putchp(letter);
  812. X                  putp(restore_cursor);  putchp('X');
  813. X               }
  814. X            if (char_sent > char_max) home_down();
  815. X         } while(end_test(above_line, 0));
  816. X      augment = (lines + 1) / 2;
  817. X      if (change_scroll_region &&
  818. X         multi_test(NULL, FALSE, 1, 0, 2, 2,
  819. X         "ind", DF_scroll_forward, "csr", &change_scroll_region))
  820. X         {
  821. X               do {
  822. X                  if (augment < 2) augment = 2;
  823. X                  putp(tparm(change_scroll_region, lines - augment,
  824. X                     lines - 1));
  825. X                  /* go to the bottom of the screen */
  826. X                  home_down();
  827. X                     for (i = 0; char_sent < char_max; ++i) {
  828. X                        char_max -= pad_sent;  ++ops;
  829. X                        sprintf(temp, "%d\r", i);
  830. X                        put_str(temp);
  831. X                        put_ind();
  832. X                     }
  833. X                  ptextln("(csr) is broken.");
  834. X                  ++ops;
  835. X                     for (i = augment; i > 1; i--) {
  836. X                        ++ops;
  837. X                        put_ind();
  838. X                     }
  839. X               } while(end_test(NULL, 0));
  840. X            putp(tparm(change_scroll_region, 0, lines - 1));
  841. X            put_clear();
  842. X         }
  843. X      can_test("csr");
  844. X      csr_not_tested = 1;
  845. X      if (save_cursor && restore_cursor && change_scroll_region &&
  846. X         multi_test(NULL, FALSE, 1, 0, 14, 3,
  847. X         "sc", &save_cursor,
  848. X         "csr", &change_scroll_region,
  849. X         "rc", &restore_cursor))
  850. X         {
  851. X            csr_not_tested = 0;
  852. X               do {
  853. X                  page_loop();
  854. X                     for (i = 1; i < columns; i++) {
  855. X                        char_max -= pad_sent;  ++ops;
  856. X                        putp(save_cursor);  putchp(letter);
  857. X                        putp(tparm(change_scroll_region, 0, lines - 1));
  858. X                        putp(restore_cursor);  putchp('X');
  859. X                     }
  860. X                  if (char_sent > char_max) home_down();
  861. X               } while(end_test(above_line, 0));
  862. X            /* scroll delay times will corrupt the "time_pad" test */
  863. X            if (!time_pad || (scroll_ms_delay == 0 && enq_ack()))
  864. X               do {
  865. X                     for (i = 0; i < lines; i++) {
  866. X                        char_max -= pad_sent;  ++ops;
  867. X                           for (j = lines - i; j > 0; j--) {
  868. X                              put_crlf();
  869. X                              char_max -= scroll_chars;
  870. X                           }
  871. X                        putp(save_cursor);
  872. X                        putp(tparm(change_scroll_region, i, lines - 1));
  873. X                        putp(restore_cursor);
  874. X                        put_str(every_line);
  875. X                     }
  876. X                  putp(save_cursor);
  877. X                  putp(tparm(change_scroll_region, 0, lines - 1));
  878. X                  putp(restore_cursor);
  879. X               } while(end_test(" ", 0));
  880. X         }
  881. X      if (cursor_address && change_scroll_region &&
  882. X         (scroll_ms_delay == 0 || !time_pad) &&
  883. X         multi_test(NULL, FALSE, 1, 0, 6, 2,
  884. X         "cup", &cursor_address, "csr", &change_scroll_region))
  885. X         do {  /* this test uses (cup) and (ind) */
  886. X               for (i = 0; i < lines; i++) {
  887. X                  char_max -= pad_sent;  ++ops;
  888. X                     for (j = lines - i; j > 0; j--) {
  889. X                        put_crlf();
  890. X                        char_max -= scroll_chars;
  891. X                     }
  892. X                  putp(tparm(change_scroll_region, i, lines - 1));
  893. X                  s = tcup(cursor_address, lines - 1, 0);
  894. X                  tputs(s, lines, putch);
  895. X                  put_str(every_line);
  896. X               }
  897. X            putp(tparm(change_scroll_region, 0, lines - 1));
  898. X            s = tcup(cursor_address, lines - 1, strlen(every_line));
  899. X            tputs(s, lines, putch);
  900. X            csr_not_tested = 0;
  901. X         } while(end_test(" ", 0));
  902. X      if (SELECT1("csr") && !stop_testing)
  903. X         if (csr_not_tested)
  904. X            {
  905. X               if (change_scroll_region)
  906. X                  ptextln("(sc) (rc) (cup) missing, (csr) change_scroll_region not tested");
  907. X               else ptextln("(csr) change_scroll_region not present");
  908. X               if (!time_pad) (void) wait_here();
  909. X               cap_tested = 1;
  910. X            }
  911. X         else  /* reset the scroll region */
  912. X            {  /* just in case we screwed it up */
  913. X               putp(tparm(change_scroll_region, 0, lines - 1));
  914. X               home_down();
  915. X            }
  916. X      dl_pad();
  917. X      il_pad();
  918. X      if (multi_test("(il1) or (dl1) insert/delete line",
  919. X         TRUE, 0, 7, 6, 2,
  920. X         "il1", &insert_line, "dl1", &delete_line))
  921. X         do {
  922. X            putln("\rThis text is written on the first line.");
  923. X            putln("It is followed by this sentence.");
  924. X            putln("((((");
  925. X            ptext("It has come to my attention that some people are");
  926. X            ptext(" running this diagnostic without actually reading");
  927. X            ptext(" the content of the messages printed on the");
  928. X            ptext(" screen.  This lack of regard for the literary");
  929. X            ptext(" talent of the programmer will not be tolerated");
  930. X            ptext(" in the future.  For all you know this message");
  931. X            ptext(" could change and you would never notice.  But I");
  932. X            ptext(" did not in fact change the message therefore it");
  933. X            ptext(" is permissible to omit reading of this message.");
  934. X            put_crlf();
  935. X            i = line_count - 1;
  936. X            go_home();
  937. X            put_newlines(2);  char_sent = 0;
  938. X               while(char_sent < char_max) {
  939. X                  char_max -= pad_sent;  ++ops;
  940. X                  putp(insert_line);
  941. X                  put_str("))))");
  942. X                  put_cr();
  943. X                  putp(delete_line);
  944. X               }
  945. X            put_newlines(i);
  946. X         } while(end_test(NULL, 0));
  947. X      if (begin_test(DF_tab, "ht", "tab", NULL, TRUE))
  948. X         do {
  949. X            /* it is not allways possible to test tabs with
  950. X               caps that do not already have padding.
  951. X               The following test uses a mixed bag of tests
  952. X               in order to aviod this problem.
  953. X               Note: I do not scroll */
  954. X            if (auto_right_margin && can_go_home)
  955. X               for (i = 1, go_home(); i < lines; i++) {
  956. X                     for (j = 8; j < columns; j += 8) {
  957. X                        char_max -= pad_sent;  ++ops;
  958. X                        put_str("\t");
  959. X                     }
  960. X                  put_str("A        ");
  961. X               }
  962. X            if (cursor_down && can_go_home)
  963. X               for (i = 1, go_home(); i < lines; i++) {
  964. X                     for (j = 8; j < columns; j += 8) {
  965. X                        char_max -= pad_sent;  ++ops;
  966. X                        put_str("\t");
  967. X                     }
  968. X                  put_str("D\r");
  969. X                  putp(cursor_down);
  970. X               }
  971. X            if (cursor_address)
  972. X               for (i = 1; i < lines; i++) {
  973. X                  s = tcup(cursor_address, i - 1, 0);
  974. X                  tputs(s, lines, putch);
  975. X                     for (j = 8; j < columns; j += 8) {
  976. X                        char_max -= pad_sent;  ++ops;
  977. X                        put_str("\t");
  978. X                     }
  979. X                  put_str("C");
  980. X               }
  981. X            go_home();
  982. X               for (i = 1; i < lines; i++) {
  983. X                     for (j = 8; j < columns; j += 8) {
  984. X                        char_max -= pad_sent;  ++ops;
  985. X                        put_str("\t");
  986. X                     }
  987. X                  putln("N");
  988. X               }
  989. X         } while(end_test("A-(am) D-(cud1) C-(cup) N-(nel)  ", 0));
  990. X      /* In terminals that emulate non-hidden attributes
  991. X         with hidden attributes, the amount of time that it takes
  992. X         to fill the screen with an attribute is nontrivial.
  993. X         The following test is designed to catch those delays */
  994. X      if (multi_test("(smso) or (rmso) enter/exit standout mode",
  995. X         FALSE, 0, 7, 6, 2,
  996. X         "smso", &enter_standout_mode, "rmso", &exit_standout_mode))
  997. X         do {
  998. X            page_loop();
  999. X            j = magic_cookie_glitch > 0 ? magic_cookie_glitch : 0;
  1000. X               for (i = 2 + j + j; i < columns; ) {
  1001. X                  char_max -= pad_sent;  ++ops;
  1002. X                  put_mode(enter_standout_mode);  i += j + j + 2;
  1003. X                  putchp('X');
  1004. X                  put_mode(exit_standout_mode);
  1005. X                  putchp('X');
  1006. X               }
  1007. X            if (char_sent > char_max) home_down();
  1008. X         } while(end_test(above_line, 0));
  1009. X      if (multi_test("(smacs) or (rmacs) enter/exit alt charset mode",
  1010. X         FALSE, 0, 7, 6, 2,
  1011. X         "smacs", &enter_alt_charset_mode,
  1012. X         "rmacs", &exit_alt_charset_mode))
  1013. X         do {
  1014. X            /* test enter even if exit is missing */
  1015. X            page_loop();
  1016. X            j = magic_cookie_glitch > 0 ? magic_cookie_glitch : 0;
  1017. X               for (i = 2 + j + j; i < columns; ) {
  1018. X                  char_max -= pad_sent;  ++ops;
  1019. X                  put_mode(enter_alt_charset_mode);
  1020. X                  i += j + j + 2;
  1021. X                  putchp(letter);
  1022. X                  put_mode(exit_alt_charset_mode);
  1023. X                  putchp(letter);
  1024. X               }
  1025. X            if (char_sent > char_max) home_down();
  1026. X         } while(end_test(NULL, 0));
  1027. X      loop_test(&flash_screen, "flash", "flash screen");
  1028. X      loop_test(&keypad_xmit, "smkx", "keypad transmit");
  1029. X      loop_test(&keypad_local, "rmkx", "exit keypad transmit");
  1030. X      loop_test(&meta_on, "smm", "turn on meta mode");
  1031. X      loop_test(&meta_off, "rmm", "turn off meta mode");
  1032. X
  1033. X      pad_time(clear_screen, &i, &j);
  1034. X      if (!stop_testing && clear_screen && !xon_xoff && (i + j) != 0
  1035. X         && SELECT1("clear"))
  1036. X         {
  1037. X            char *clr = liberated(clear_screen);
  1038. X
  1039. X            ptext("If you would like to see if the terminal will really lock up.");
  1040. X            ptext("  I will send the clear screen sequence without the pads.");
  1041. X            ptext("  Type yes to trash your terminal: ");
  1042. X            milli_pad = milli_reps = char_sent = 0;
  1043. X            char_max = full_test;
  1044. X            (void) acco_pad(NULL, clear_screen);
  1045. X            if (getchp(STRIP_PARITY) == 'y')
  1046. X               do {
  1047. X                     while(char_sent < char_max) {
  1048. X                        char_max -= pad_sent;  ++ops;
  1049. X                        put_str("Erase this!");
  1050. X                        putp(clr);
  1051. X                     }
  1052. X                  ptextln("\nIf you can read this you probably have your terminal set for xon/xoff.");
  1053. X               } while(end_test(NULL, 0));
  1054. X         }
  1055. X#ifdef ACCO
  1056. X      /* close the results file for multi_test() */
  1057. X      if (fpacco) fclose(fpacco);
  1058. X#endif
  1059. X   }
  1060. END_OF_FILE
  1061. if test 40122 -ne `wc -c <'pad.c'`; then
  1062.     echo shar: \"'pad.c'\" unpacked with wrong size!
  1063. fi
  1064. # end of 'pad.c'
  1065. fi
  1066. if test -f 'sysdep.c' -a "${1}" != "-c" ; then 
  1067.   echo shar: Will not clobber existing file \"'sysdep.c'\"
  1068. else
  1069. echo shar: Extracting \"'sysdep.c'\" \(11601 characters\)
  1070. sed "s/^X//" >'sysdep.c' <<'END_OF_FILE'
  1071. X/*
  1072. X** This software is Copyright (c) 1991 by Daniel Weaver.
  1073. X**
  1074. X** Permission is hereby granted to copy, distribute or otherwise
  1075. X** use any part of this package as long as you do not try to make
  1076. X** money from it or pretend that you wrote it.  This copyright
  1077. X** notice must be maintained in any copy made.
  1078. X**
  1079. X** Use of this software constitutes acceptance for use in an AS IS
  1080. X** condition. There are NO warranties with regard to this software.
  1081. X** In no event shall the author be liable for any damages whatsoever
  1082. X** arising out of or in connection with the use or performance of this
  1083. X** software.  Any use of this software is at the user's own risk.
  1084. X**
  1085. X**  If you make modifications to this software that you feel
  1086. X**  increases it usefulness for the rest of the community, please
  1087. X**  email the changes, enhancements, bug fixes as well as any and
  1088. X**  all ideas to me. This software is going to be maintained and
  1089. X**  enhanced as deemed necessary by the community.
  1090. X*/
  1091. X/*
  1092. X * Operating system dependant functions.  Such as special tty handler
  1093. X * modes.
  1094. X */
  1095. X
  1096. X#include <sys/errno.h>
  1097. X#if defined(vax) || defined(_AIX)
  1098. X#include <fcntl.h>
  1099. X#else
  1100. X#include <sys/fcntl.h>
  1101. X#endif
  1102. X#include <curses.h>
  1103. X#include <signal.h>
  1104. X#include "ted.h"
  1105. X
  1106. X/* The appropriate speeds for various termio settings. */
  1107. Xint speeds[] =
  1108. X    {
  1109. X    0,        /*  B0, */
  1110. X    50,        /*  B50, */
  1111. X    75,        /*  B75, */
  1112. X    110,    /*  B110, */
  1113. X    134,    /*  B134, */
  1114. X    150,    /*  B150, */
  1115. X    200,    /*  B200, */
  1116. X    300,    /*  B300, */
  1117. X    600,    /*  B600, */
  1118. X    1200,    /*  B1200, */
  1119. X    1800,    /*  B1800, */
  1120. X    2400,    /*  B2400, */
  1121. X    4800,    /*  B4800, */
  1122. X    9600,    /*  B9600, */
  1123. X    19200,    /*  EXTA, */
  1124. X    38400,    /*  EXTB, */
  1125. X    0,
  1126. X    };
  1127. X
  1128. X/* error report location for ioctl's */
  1129. Xextern int errno;
  1130. X
  1131. X#ifdef ICANON  /* ATT UNIX */
  1132. X#define SLEEP(x)
  1133. X#define TTY_IS_NOECHO    !(new_modes.c_lflag & ECHO)
  1134. X#define TTY_IS_OUT_TRANS (new_modes.c_oflag & OPOST)
  1135. X#define TTY_IS_CHAR_MODE !(new_modes.c_lflag & ICANON)
  1136. X
  1137. Xstruct termio old_modes, new_modes;
  1138. X
  1139. Xtty_raw(minch, mask)
  1140. Xint minch, mask;
  1141. X   {  /* set tty to raw noecho */
  1142. X      new_modes = old_modes;
  1143. X#ifdef SELECT
  1144. X      new_modes.c_cc[VMIN]=1;
  1145. X#else
  1146. X      new_modes.c_cc[VMIN]=minch;
  1147. X#endif
  1148. X      new_modes.c_cc[VTIME]=2;
  1149. X      new_modes.c_lflag &=
  1150. X         ~(ISIG|ICANON|XCASE|ECHO|ECHOE|ECHOK|ECHONL);
  1151. X#ifdef LOBLK
  1152. X      new_modes.c_lflag &= ~LOBLK;
  1153. X#endif
  1154. X      new_modes.c_oflag &= ~(OPOST|OLCUC|TABDLY);
  1155. X      if (mask == ALLOW_PARITY)
  1156. X         {
  1157. X            new_modes.c_cflag &= ~(CSIZE|PARENB|HUPCL);
  1158. X            new_modes.c_cflag |= CS8;
  1159. X         }
  1160. X      new_modes.c_iflag &=
  1161. X         ~(IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK|ISTRIP|INLCR|IGNCR|ICRNL|
  1162. X         IUCLC|IXON|IXANY|IXOFF);
  1163. X      if (not_a_tty) return;
  1164. X      ioctl(fileno(stdin), TCSETAW, &new_modes);
  1165. X   }
  1166. X
  1167. X
  1168. Xint
  1169. Xtty_meta_prep()
  1170. X   {  /* print a warning before the meta key test */
  1171. X      if (not_a_tty) return 0;
  1172. X      if ((old_modes.c_cflag & CSIZE) == CS8) return 0;
  1173. X      ptext("The meta key test must be run with the");
  1174. X      ptext(" terminal set for 8 data bits.  Two stop bits");
  1175. X      ptext(" may also be needed for correct display.  I will");
  1176. X      ptext(" transmit 8 bit data but if the terminal is set for");
  1177. X      ptext(" 7 bit data, garbage may appear on the screen.");
  1178. X      return 1;
  1179. X   }
  1180. X
  1181. X
  1182. Xtty_set()
  1183. X   {  /* set tty to special modes */
  1184. X      new_modes = old_modes;
  1185. X      new_modes.c_cc[VMIN]=1;
  1186. X      new_modes.c_cc[VTIME]=1;
  1187. X      new_modes.c_lflag &= ~(ISIG|ICANON|ECHO|ECHOE|ECHOK|ECHONL);
  1188. X      new_modes.c_oflag &= ~(ONLCR|OCRNL|ONLRET|OFILL);
  1189. X      if (char_mask == ALLOW_PARITY) new_modes.c_iflag &= ~ISTRIP;
  1190. X      switch (select_xon_xoff) {
  1191. X         case 0:
  1192. X            new_modes.c_iflag &= ~(IXON|IXOFF);
  1193. X            break;
  1194. X         case 1:
  1195. X#if sequent
  1196. X            /* the sequent System V emulation is broken */
  1197. X            new_modes = old_modes;
  1198. X            new_modes.c_cc[VEOL] = 6;  /* control F  (ACK) */
  1199. X#endif
  1200. X            new_modes.c_iflag |= IXON | IXOFF;
  1201. X            break;
  1202. X         }
  1203. X      switch (select_delay_type) {
  1204. X         case 0:
  1205. X            new_modes.c_oflag &=
  1206. X               ~(NLDLY|CRDLY|TABDLY|BSDLY|VTDLY|FFDLY);
  1207. X            break;
  1208. X         case 1:
  1209. X            new_modes.c_oflag &=
  1210. X               ~(NLDLY|CRDLY|TABDLY|BSDLY|VTDLY|FFDLY);
  1211. X            new_modes.c_oflag |= NL1 | CR2;
  1212. X            break;
  1213. X         }
  1214. X      if (!(new_modes.c_oflag & ~OPOST)) new_modes.c_oflag &= ~OPOST;
  1215. X      if (not_a_tty) return;
  1216. X      ioctl(fileno(stdin), TCSETAW, &new_modes);
  1217. X   }
  1218. X
  1219. X
  1220. Xtty_reset()
  1221. X   {  /* reset the tty to the original modes */
  1222. X      fflush(stdout);
  1223. X      if (not_a_tty) return;
  1224. X      ioctl(fileno(stdin), TCSETAW, &old_modes);
  1225. X   }
  1226. X
  1227. X
  1228. Xtty_init()
  1229. X   {  /* ATT terminal init */
  1230. X      int flags;
  1231. X
  1232. X#ifdef F_GETFL
  1233. X      flags = fcntl(fileno(stdin), F_GETFL, 0);
  1234. X      nodelay_read = flags & O_NDELAY;
  1235. X#else
  1236. X      nodelay_read = FALSE;
  1237. X#endif
  1238. X      not_a_tty = FALSE;
  1239. X      if (ioctl(fileno(stdin), TCGETA, &old_modes) == -1)
  1240. X         {
  1241. X            if (errno == ENOTTY)
  1242. X               {
  1243. X                  tty_frame_size = 20;
  1244. X                  not_a_tty = TRUE;
  1245. X                  return;
  1246. X               }
  1247. X            printf("ioctl error: %d\n", errno);
  1248. X            exit(1);
  1249. X         }
  1250. X      /* if TAB3 is set then setterm() wipes out tabs (ht) */
  1251. X      new_modes = old_modes;
  1252. X      new_modes.c_oflag &= ~TABDLY;
  1253. X      if (ioctl(fileno(stdin), TCSETAW, &new_modes) == -1)
  1254. X         {
  1255. X            printf("ioctl error: %d\n", errno);
  1256. X            exit(1);
  1257. X         }
  1258. X#ifdef sequent
  1259. X      /* the sequent ATT emulation is broken soooo. */
  1260. X      old_modes.c_cflag &= ~(CSIZE | CSTOPB);
  1261. X      old_modes.c_cflag |= CS7 | PARENB;
  1262. X#endif
  1263. X      catchsig();
  1264. X      tty_baud_rate = speeds[old_modes.c_cflag & CBAUD];
  1265. X         switch (old_modes.c_cflag & CSIZE) {
  1266. X            case CS5:  tty_frame_size = 10;  break;
  1267. X            case CS6:  tty_frame_size = 12;  break;
  1268. X            case CS7:  tty_frame_size = 14;  break;
  1269. X            case CS8:  tty_frame_size = 16;  break;
  1270. X         }
  1271. X      tty_frame_size += 2 +
  1272. X         ((old_modes.c_cflag & PARENB) ? 2 : 0) +
  1273. X         ((old_modes.c_cflag & CSTOPB) ? 4 : 2);
  1274. X      tty_abort = old_modes.c_cc[VINTR];
  1275. X   }
  1276. X
  1277. X
  1278. X#else  /* berkeley */
  1279. X#define SLEEP(x) sleep(x)
  1280. X#define TTY_IS_NOECHO    !(new_modes.sg_flags & ECHO)
  1281. X#define TTY_IS_OUT_TRANS ((new_modes.sg_flags & (CBREAK|RAW|CRMOD)) == CRMOD)
  1282. X#define TTY_IS_CHAR_MODE ((new_modes.sg_flags & (CBREAK|RAW)) != 0)
  1283. X
  1284. Xstruct sgttyb old_modes, new_modes;
  1285. X
  1286. Xtty_raw(minch, mask)
  1287. Xint minch, mask;
  1288. X   {  /* set tty to raw noecho */
  1289. X      fflush(stdout);
  1290. X      new_modes = old_modes;
  1291. X      new_modes.sg_flags |= RAW;
  1292. X      new_modes.sg_flags &= ~(ALLDELAY | ECHO | CRMOD | CBREAK);
  1293. X      if (not_a_tty) return;
  1294. X      ioctl(fileno(stdin), TIOCSETP, &new_modes);
  1295. X   }
  1296. X
  1297. Xint
  1298. Xtty_meta_prep()
  1299. X   {  /* print a warning before the meta key test */
  1300. X      if (not_a_tty) return 0;
  1301. X      ptext("The meta key test must be run with the");
  1302. X      ptext(" terminal set for 8 data bits.  Two stop bits");
  1303. X      ptext(" may also be needed for correct display.");
  1304. X      return 1;
  1305. X   }
  1306. X
  1307. Xextern short ospeed;
  1308. X
  1309. Xtty_set()
  1310. X   {  /* set tty modes */
  1311. X      fflush(stdout);
  1312. X      new_modes = old_modes;
  1313. X      new_modes.sg_flags &= ~(ECHO | CRMOD | CBREAK | RAW);
  1314. X      if (select_delay_type == 0 & select_xon_xoff == 0)
  1315. X         {
  1316. X            new_modes.sg_flags |= RAW;
  1317. X         }
  1318. X      else new_modes.sg_flags |= CBREAK;
  1319. X      switch (select_delay_type) {
  1320. X         case 0:
  1321. X            new_modes.sg_flags &= ~(ALLDELAY);
  1322. X            break;
  1323. X         case 1:
  1324. X            new_modes.sg_flags &= ~(ALLDELAY);
  1325. X            new_modes.sg_flags |= NL2 | CR1;
  1326. X            break;
  1327. X         }
  1328. X#ifdef TANDEM
  1329. X      switch (select_xon_xoff) {
  1330. X         case 0:
  1331. X            new_modes.sg_flags &= ~TANDEM;
  1332. X            break;
  1333. X         case 1:
  1334. X            new_modes.sg_flags |= TANDEM;
  1335. X            break;
  1336. X         }
  1337. X#endif
  1338. X      if (select_pads == 1) ospeed = -1;
  1339. X      if (not_a_tty) return;
  1340. X      ioctl(fileno(stdin), TIOCSETP, &new_modes);
  1341. X   }
  1342. X
  1343. X
  1344. Xtty_reset()
  1345. X   {  /* reset the tty to the original modes */
  1346. X      fflush(stdout);
  1347. X      if (not_a_tty) return;
  1348. X      ioctl(fileno(stdin), TIOCSETP, &old_modes);
  1349. X   }
  1350. X
  1351. X
  1352. Xtty_init()
  1353. X   {  /* Berkeley Unix tty init */
  1354. X      struct tchars tc;
  1355. X
  1356. X      not_a_tty = nodelay_read = FALSE;
  1357. X      if (ioctl(fileno(stdin), TIOCGETC, &tc) == -1)
  1358. X         {
  1359. X            if (errno == ENOTTY)
  1360. X               {
  1361. X                  not_a_tty = TRUE;
  1362. X                  return;
  1363. X               }
  1364. X            printf("ioctl error: %d\n", errno);
  1365. X            exit(1);
  1366. X         }
  1367. X      tty_abort = tc.t_intrc;
  1368. X      if (ioctl(fileno(stdin), TIOCGETP, &old_modes) == -1)
  1369. X         {
  1370. X            printf("ioctl error: %d\n", errno);
  1371. X            exit(1);
  1372. X         }
  1373. X      catchsig();
  1374. X      tty_baud_rate = speeds[old_modes.sg_ospeed];
  1375. X      tty_frame_size = 22;  /* 8 data bits, 2 stop bits,    1 start bit */
  1376. X      tty_frame_size = 20;  /* 8 data bits, 1 stop bit,     1 start bit */
  1377. X#ifdef vax
  1378. X      tty_frame_size = 21;  /* 8 data bits, 1.5 stop bits,  1 start bit */
  1379. X#endif
  1380. X      if (ospeed < 0) ospeed = old_modes.sg_ospeed;
  1381. X   }
  1382. X#endif
  1383. X
  1384. Xint
  1385. Xstty_query(q)
  1386. Xint q;
  1387. X   {  /* return information about the terminal */
  1388. X      switch (q) {
  1389. X         case TTY_NOECHO:
  1390. X            return TTY_IS_NOECHO;
  1391. X         case TTY_OUT_TRANS:
  1392. X            return TTY_IS_OUT_TRANS;
  1393. X         case TTY_CHAR_MODE:
  1394. X            return TTY_IS_CHAR_MODE;
  1395. X      }
  1396. X   }
  1397. X
  1398. X#ifdef SELECT
  1399. Xint
  1400. Xchar_ready()
  1401. X{
  1402. X    struct _timeval {
  1403. X        long tv_sec;
  1404. X        long tv_usec;
  1405. X    };
  1406. X    int ifds, ofds, efds, n;
  1407. X    struct _timeval tv;
  1408. X
  1409. X    ifds = 1 << fileno(stdin);
  1410. X    ofds = efds = 0;
  1411. X    tv.tv_sec = 0;
  1412. X    tv.tv_usec = 200000;
  1413. X    n = select(20, &ifds, &ofds, &efds, &tv);
  1414. X    return (n != 0);
  1415. X}
  1416. X#else
  1417. X#ifdef FIONREAD
  1418. Xint
  1419. Xchar_ready()
  1420. X   {
  1421. X      int i, j;
  1422. X
  1423. X      /* the following loop has to be tuned for each computer */
  1424. X         for (j = 0; j < 1000; j++) {
  1425. X            ioctl(fileno(stdin), FIONREAD, &i);
  1426. X            if (i) return i;
  1427. X         }
  1428. X      return i;
  1429. X   }
  1430. X#else
  1431. X#define char_ready() 1
  1432. X#endif
  1433. X#endif
  1434. X
  1435. X
  1436. Xnite_nite()
  1437. X   {  /* go to sleep */
  1438. X      SLEEP(1);
  1439. X   }
  1440. X
  1441. X
  1442. Xread_key(buf, max)
  1443. Xchar *buf;
  1444. Xint max;
  1445. X   {  /* read one function key from the input stream */
  1446. X      int got, ask;
  1447. X      char *s;
  1448. X
  1449. X      *buf = '\0';
  1450. X      s = buf;
  1451. X      fflush(stdout);
  1452. X      /* ATT unix may return 0 or 1, Berkeley Unix should be 1 */
  1453. X         while (read(fileno(stdin), s, 1) == 0);
  1454. X      ++s;
  1455. X      --max;
  1456. X         while (max > 0 && (ask = char_ready())) {
  1457. X            if (ask > max) ask = max;
  1458. X            if (got = read(fileno(stdin), s, ask)) s += got;
  1459. X            else break;
  1460. X            max -= got;
  1461. X         }
  1462. X      *s = '\0';
  1463. X      /* strip high order bits (if any) */
  1464. X         for (s = buf; *s; *s++ &= char_mask);
  1465. X   }
  1466. X
  1467. X
  1468. Xignoresig( )
  1469. X{
  1470. X    /* ignore signals */
  1471. X    signal(SIGINT, SIG_IGN);
  1472. X    signal(SIGHUP, SIG_IGN);
  1473. X    signal(SIGQUIT, SIG_IGN);
  1474. X    signal(SIGTERM, SIG_IGN);
  1475. X}
  1476. X
  1477. X    /*  onintr( )
  1478. X     *
  1479. X     *  is the interrupt handling routine
  1480. X     *  onintr turns off interrupts while doing clean-up
  1481. X     *
  1482. X     *  onintr always exits fatally
  1483. X     */
  1484. X
  1485. X
  1486. Xonintr()
  1487. X{
  1488. X    ignoresig();
  1489. X    tty_reset();
  1490. X    exit(1);
  1491. X}
  1492. X
  1493. X
  1494. X    /*  catchsig( )
  1495. X     *
  1496. X     *  set up to field interrupts (via function onintr( ))
  1497. X     *  so that if interrupted we can restore the correct terminal modes
  1498. X     *
  1499. X     *  catchsig simply returns
  1500. X     */
  1501. X
  1502. X
  1503. Xcatchsig( )
  1504. X{
  1505. X    /* EXTERNAL VARIABLE USED */
  1506. X    extern        onintr( );
  1507. X
  1508. X    if ((signal(SIGINT, SIG_IGN)) == SIG_DFL)
  1509. X        signal(SIGINT, onintr);
  1510. X
  1511. X    if ((signal(SIGHUP, SIG_IGN)) == SIG_DFL)
  1512. X        signal(SIGHUP, onintr);
  1513. X
  1514. X    if ((signal(SIGQUIT, SIG_IGN)) == SIG_DFL)
  1515. X        signal(SIGQUIT, onintr);
  1516. X
  1517. X    if ((signal(SIGTERM, SIG_IGN)) == SIG_DFL)
  1518. X        signal(SIGTERM, onintr);
  1519. X
  1520. X}
  1521. END_OF_FILE
  1522. if test 11601 -ne `wc -c <'sysdep.c'`; then
  1523.     echo shar: \"'sysdep.c'\" unpacked with wrong size!
  1524. fi
  1525. # end of 'sysdep.c'
  1526. fi
  1527. echo shar: End of archive 2 \(of 7\).
  1528. cp /dev/null ark2isdone
  1529. MISSING=""
  1530. for I in 1 2 3 4 5 6 7 ; do
  1531.     if test ! -f ark${I}isdone ; then
  1532.     MISSING="${MISSING} ${I}"
  1533.     fi
  1534. done
  1535. if test "${MISSING}" = "" ; then
  1536.     echo You have unpacked all 7 archives.
  1537.     rm -f ark[1-9]isdone
  1538. else
  1539.     echo You still need to unpack the following archives:
  1540.     echo "        " ${MISSING}
  1541. fi
  1542. ##  End of shell archive.
  1543. exit 0
  1544.  
  1545. exit 0 # Just in case...
  1546. -- 
  1547. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  1548. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  1549. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  1550. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  1551.